import pymysql
import pandas as pd

# 建立与MySQL数据库的连接
cnx = pymysql.connect(
  host='localhost',
  user='root',
  password='root',
  database='StudentInfo'
)

# 构建SQL查询语句，提取用户-绩点数据
query = "SELECT user_id, course_id,grade FROM user_grades"

# 使用pandas的read_sql函数执行查询并将结果存储到DataFrame中
df = pd.read_sql(query, cnx)

# 关闭数据库连接
cnx.close()

# 将DataFrame转换为用户-绩点的关系矩阵
# user_grade_matrix = df.pivot(index='user_id', columns='course_id', values='grade').fillna(0)
# user_grade_matrix = df.pivot_table(index='user_id', columns='course_id', values='grade', aggfunc='sum', fill_value=0)
# 创建用户-绩点的关系矩阵，只包含课程绩点，不显示用户ID和课程ID
user_grade_matrix = df.pivot_table(index='user_id', columns='course_id', values='grade', aggfunc='sum', fill_value=0)
user_grade_matrix.index.name = None
user_grade_matrix.columns.name = None
print(user_grade_matrix)

from scipy.spatial.distance import cosine

# 计算绩点之间的相似性度量（余弦相似度）
grade_sim_matrix = pd.DataFrame(index=user_grade_matrix.columns, columns=user_grade_matrix.columns)

for grade1 in grade_sim_matrix.index:
    for grade2 in grade_sim_matrix.columns:
        user_grade1 = user_grade_matrix[grade1]
        user_grade2 = user_grade_matrix[grade2]
        similarity = 1 - cosine(user_grade1, user_grade2)
        grade_sim_matrix.loc[grade1, grade2] = similarity

print(grade_sim_matrix)

def get_user_recommendations(user_id, top_n=3):
  user_grades = user_grade_matrix.loc[user_id]  # 获取给定用户的绩点评分

  # 找到与给定用户最相似的其他用户
  similar_users = grade_sim_matrix.dot(user_grades).sort_values(ascending=False)

  # 生成推荐列表
  recommendations = user_grade_matrix.loc[similar_users.index[1:top_n + 1], :]
  return recommendations


# 从用户获取输入值并将其赋给变量
user_input = input("请输入一个值: ")

# 打印变量的值


get_user_recommendations(user_input,3)